<?php
class UploadFile{
	//下面四个需要设置
	private $max_size = 1048576;//默认为1MB   2mb为2097152
	private $types = ['jpg'];//过滤类型
	private $re_name = true;//上传重命名
	private $up_dir = './uploads';//上传的目录.
	//下面2个用私有,但需要获取
	private $message = '';//每次上传的信息(包括错误,成功)
	private $success_files = [];//如果上传成功,就能获取上传文件的列表.

	
	/**
	 * 获取当前消息(包括上传成功或失败)
	 * @return string 当前的消息字符串!
	 */
	function get_message(){
		return $this->message;
	}
	/**
	 * 获取上传后文件的列表,请在上传后获取.
	 * @return array 当前上传的文件列表,
	 */
	function get_files(){
		return $this->success_files;
	}
	
	/**
	 * 设置当前对象的参数(max_size:限制文件最大,types:允许上传的类型数组,re_name:是否重命名,默认重命名,up_dir:上传目录)
	 * @param $key string 设置的键
	 * @param $val 设置的值
	 * @return boolean 成功返回TRUE,失败返回FALSE.
	 */
	function set($key, $val){
		//isset($this->$key)
		if(array_key_exists($key, get_class_vars(get_class($this))) && $key != 'message' && $key != 'success_files'){
			$this->$key = $val;
			return TRUE;
		}else{
			$this->message = '设置的参数不存在!';
			return FALSE;
		}
	}
	
	
	
	//上传前要做几件事件1.判断错误,2.判断大小,3.获取扩展名,4.过滤类型 5.重命名
	function upload(){
		//如果上传的目录不存在,则创建
		if(!is_dir($this->up_dir)){
			mkdir($this->up_dir,0777,TRUE);
		}
		//如果$_FILES数组是空的,根本没文件上传而来
		if(empty($_FILES)){
			$this->message = '根本没有文件上传!';
			return FALSE;
		}
		
		//进行数组格式处理:只要有一个文件出错,全部不上传====================================
		$temp_arr = [];
		foreach($_FILES as $file){
			//$count = count($file['name']);
			if(is_array($file['name'])){
				$temp = [];
				$count = count($file['name']);
				for($i = 0 ; $i < $count ; $i++){
					$temp['name'] = $file['name'][$i];//获取每个文件名
					$temp['type'] = pathinfo($file['name'][$i],PATHINFO_EXTENSION);//$file['type'][$i];
					$temp['tmp_name'] = $file['tmp_name'][$i];
					$temp['error'] = $file['error'][$i];
					//获取是否有错
					if($this->get_error($temp['error'])){
						 return FALSE;
					}
					$temp['size'] = $file['size'][$i];
					//判断大小
					if($temp['size'] > $this->max_size){
						$this->message = '上传的文件超过了对象限制的大小,上传失败!';
						return FALSE;
					}
					//过滤类型
					$ext = pathinfo($temp['name'],PATHINFO_EXTENSION);
					if(empty($this->types) || !in_array($ext, $this->types)){
						$this->message = '文件上传的类型不被允许!上传失败!';
						return FALSE;
					}
					$temp_arr[] = $temp;
				}
			}else{
				//获取是否有错
				if($this->get_error($file['error'])){
					return FALSE;
				}
				//判断大小
				if($file['size'] > $this->max_size){
					$this->message = '上传的文件超过了对象限制的大小,上传失败!';
					return FALSE;
				}
				//过滤类型
				$ext = pathinfo($file['name'],PATHINFO_EXTENSION);
				if(empty($this->types) || !in_array($ext, $this->types)){
					$this->message = '文件上传的类型不被允许!上传失败!';
					return FALSE;
				}
				//获取扩展名
				$temp_arr[] = $file;
				$temp_arr[count($temp_arr)-1]['type'] = pathinfo($file['name'],PATHINFO_EXTENSION);
			}
			//判断大小 OR 过滤类型 OR 获取是否有错 的代码建议并在这里-------------------
		}
		//5.重命名文件:(时间戳+随机数+判断是否存在.)
		foreach($temp_arr as $v){
			if($this->re_name){
				do{
					$time = dechex(time());
					$rand = rand(100, 999);
					$new_name = $time . $rand . '.' . $v['type'];
				}while(file_exists($this->up_dir . '/' .$new_name));
			}else{
				$new_name = $v['tmp_name'];
			}
			if(move_uploaded_file($v['tmp_name'] , $this->up_dir . '/' . $new_name)){
				$this->success_files[] = $this->up_dir . '/' . $new_name;
			}
			
		}
		$this->message = '上传成功!';
		
		/*print_r($temp_arr);
		echo '<hr />';
		echo $this->message;*/
		return TRUE;
	}
	/**
	 * 获取上传文件是否有错
	 * @param $error $_FILES中的错误编码.
	 * @return TRUE OR FALSE表示是否有错.
	 */
	private function get_error($error){
		if($error != 0){
			//这段代码是可选的....
			switch($error){
				case 1:
					$this->message = '文件过大';
					break;
				case 2:
					$this->message = '文件大于HTML表单设置大小';
					break;
				case 3:
					$this->message = '文件部分被上传';
					break;
				case 4:
					$this->message = '没有上传文件';//....................
					break;
				default:
					$this->message = '文件上传出错,原因未知';
			}
			$this->message .= ',上传失败!';
			return TRUE;
		}else{
			return FALSE;
		}
	}
}

/*//调用实例==========================================================
$upload = new UploadFile();
if($upload->set('types',['jpg','jpeg','jpe','gif','png'])) echo '设置成功!<br />';
$upload->set('up_dir','./uploads/temp');

if($upload->upload()){
	echo '上传成功';
	//print_r($upload->success_files);
	foreach($upload->get_files() as $v){
		echo '<img src="'.$v.'" />';
	}
}else{
	echo  $upload->get_message();
}*/
?>